/*
 * TrimResult.java
 *
 * Created on 19 Март 2008 г., 0:54
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package trim.common.result;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import trim.common.inputdata.FormatOrder;

/**
 * Класс представляющий собой решение ЗФР. Все расчетные модули должны
 * в результате возвращать экземпляр этого класса.
 * @author Дмитрий
 */
public class TrimResult extends ArrayList<Pattern>
{

  /**
   * Конструктор по умолчанию создает пустое решение.
   */
  public TrimResult()
  {
  }

  /**
   * Получение общего отхода решения
   * @return общий отход решения
   */
  public int getTail()
  {
    int res=0;
    for(Pattern p:this)
    {
      res+=p.getPatternTail()*p.getCount();
    }
    return res;
  }
  /**
   * Получение общей используемой площади
   * @return общая используемая площадь
   */
  public int getUsedArea()
  {
    int res=0;
    for(Pattern p:this)
    {
      res+=p.getPatternUsedArea()*p.getCount();
    }
    return res;
  }

  /**
   * Получение количества вырезаемых в решении форматов (вырезаемый ВТ)
   * @return вырезаемый ВТ
   */
  public List<TrimmedFormatOrder> getTrimmedFormatOrders()
  {
    Map<Integer,TrimmedFormatOrder> m=new HashMap();
    for(Pattern p:this)
    {
      for(PatternItem pi:p)
      {
        TrimmedFormatOrder rp=m.get(pi.getFormat().getLength());
        if(rp==null)
        {
          rp=new TrimmedFormatOrder();
          rp.setFormat(pi.getFormat());
          m.put(rp.getFormat().getLength(),rp);
        }
        rp.setCount(rp.getCount()+p.getCount());
      }
    }
    List<TrimmedFormatOrder> res=new ArrayList();
    for(TrimmedFormatOrder pi:m.values())
    {
      res.add(pi);
    }
    return res;
  }
public List<UsedMaterial> getUsedMaterials()
{
  throw new UnsupportedOperationException();
}
  /**
   * Количество используемых единиц сырья (заготовок)
   * @return количество используемых единиц сырья (заготовок)
   */
  public int getUsedMaterialsCount()
  {
    int res=0;
    for(Pattern p:this)
    {
      res+=p.getCount();
    }
    return res;
  }

  /**
   * Общее количество вырезаемых заготовок
   * @return Общее количество вырезаемых заготовок
   */
  public int getTotalTrimmedItemsCount()
  {
    int res=0;
    for(Pattern p:this)
    {
      res+=p.size()*p.getCount();
    }
    return res;
  }

  /**
   * Расчет коэффициента эффективности для данного решения.
   * Равен отношению полезной площади к общей площади всех испольхованных тамбуров.
   * @return коэффициент эффективности
   */
  public double getEfficiency()
  {
    double tw=0;//общая длина всех заготовок
    for(Pattern p:this)
      tw+=p.getMaterial().getLength()*p.getCount();
    return getUsedArea()/tw;
  }

  public int getDifferentPatternsCount()
  {
    return size();
  }
}



